Linux 文件权限
Linux 常用的权限组合 ⭐
常用的 Linux 文件权限:
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx
文件权限与归属
文件默认权限
创建一个新的文件或目录时,他的默认权限会是什么呢?
$ umask
022
umask 就是指定 “目前使用者在创建文件或目录时候的权限默认值”
查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字体态的权限设置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限
$ umask -S
u=rwx,g=rx,o=rx
可以通过 umask 修改默认的文件权限
$ umask 002
检查命令的权限
# 检查命令的位置
which rm
# /bin/rm
# 检查用户组
ls -lh /bin/rm
# -rwxr-xr-x 1 root root 63K 1月 18 2018 /bin/rm
常见的权限字符
- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道设备文件
使用 ll
可以看到文件权限
drwxr-xr-x 3 alsritter alsritter 4096 4月 11 08:55 ./
drwxr-xr-x 21 alsritter alsritter 4096 4月 11 07:02 ../
drwxrwxrwx 2 alsritter alsritter 4096 4月 10 10:48 java_temp/
-rw-rw-r-- 1 alsritter alsritter 2462 4月 11 08:24 temp2.txt
-rw-rw-r-- 1 alsritter alsritter 970 4月 11 08:55 temp3.txt
-rw-r--r-- 1 alsritter alsritter 17242 4月 11 04:37 temp.txt
第一个字符是用来标识是文件夹还是文件
d:表示这个是目录 -:表示这个是文件
后面的每三个为一组:
例如 -rw-rw-r--
分成 rw-
rw-
r--
第一组是:owner 权限(所有者的权限) 第二组是:group 权限(当前所有组的权限) 第三组是:others 权限(其他人的权限)
各种权限的组成
三种身份各有自己的 read/write/execute
权限
权限 | 二进制 | 八进制 | 描述 |
---|---|---|---|
--- | 000 | 0 | 无权限 |
--x | 001 | 1 | 只有执行权限 |
-w- | 010 | 2 | 只有写入权限 |
-wx | 011 | 3 | 写和执行权限 |
r-- | 100 | 4 | 读权限 |
r-x | 101 | 5 | 读取和执行的权限 |
rw- | 110 | 6 | 读取的写入的权限 |
rwx | 111 | 7 | 所有权限 |
所以:660 等价于
-rw-rw----
注意:有时候在某些需要加权限的语言中(如 Golang) 0660
也表示 660
因为前面加 0 表示的就是 8 进制
chown 设置文件拥有者
修改组群的命令使 chgrp,即 change group,那么修改文件拥有者的命令自然就是 chown,即 change owner。chown 功能很多,不仅仅能更改文件拥有者,还可以修改文件所属组群。如果需要将某一目录下的所有文件都改变其拥有者,可以使用 -R
参数。
利用 chown 将指定文件的拥有者改为指定的用户或组
- 用户可以是 “用户名” 或者 “用户 ID”
- 组可以是 组名 或者 组 ID
使用权限: root
语法
chown [-cfhvR] [--help] [--version] user[:group] file...
# 语法如下:
chown [-R] 账号名称 文件/目录
chown [-R] 账号名称:组群 文件/目录
参数说明:
user
: 新的文件拥有者的使用者 IDgroup
: 新的文件拥有者的使用者组(group)-c
: 显示更改的部分的信息-f
: 忽略错误信息-h
:修复符号链接-v
: 显示详细的处理信息-R
: 处理指定目录以及其子目录下的所有文件--help
: 显示辅助说明--version
: 显示版本
chmod 给文件添加权限 ⭐
注意:只有超管和文件所有者可以修改文件权限
Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对这三个属组(粒度),设置不同的 r/w/x 权限。
- u 表示该文件的拥有者
- g 表示与该文件的拥有者属于同一个群体(group)者
- o 表示其他以外的人,a 表示这三者皆是。
通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
语法
chown [-cfhvR] [--help] [--version] user[:group] file...
常用操作
# 使用例
sudo chmod -R 777 /var/log/redis/
# 给文件加执行权限(一般使用这种)⭐
sudo chmod u+x filename
第二行命令的 opt 则是代表操作,可以为:
+
:添加某个权限-
:取消某个权限=
:赋予给定的权限,并取消原有的权限
常用的 Linux 文件权限:
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx
参数说明:
user
: 新的文件拥有者的使用者 IDgroup
: 新的文件拥有者的使用者组(group)-c
: 显示更改的部分的信息-f
: 忽略错误信息-h
:修复符号链接-v
: 显示详细的处理信息-R
: 处理指定目录以及其子目录下的所有文件--help
: 显示辅助说明--version
: 显示版本
例如:
#===============更改文件权限==========================================================
# 将文件 file1.txt 的拥有者设为 git,群体的使用者 gitgroup :
chown git:gitgroup file1.txt
# 将目前目录下的所有文件与子目录的拥有者皆设为 git,群体的使用者 gitgroup:
chown -R git:gitgroup *
# 设置所有人可以读写及执行
chmod 777 file # (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)
# 设置拥有者可读写,其他人不可读写执行
chmod 600 file # (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )
#===============更改文件拥有者==========================================================
# 设置文件 d.key、e.txt的拥有者设为 users 群体的 tom
chown tom:users file d.key e.txt
# 设置当前目录下与子目录下的所有文件的拥有者为 users 群体的 James
chown -R James:users *
文件夹、文件权限区别
文件权限
r
读权限read 4
w
写权限write 2
x
可执行(,标识这个文件为可执行文件例如Windows的exe) 1
文件夹权限
r
列出文件列表(仅限于名字)
w
可以在目录删除和创建文件(包括修改名字)
x
可以进入目录(不能查看目录内容)
文件的所属人没有权限,但是所属组有权限,表示他还是有权限(权限可以 叠加)
文件的特殊权限
使用 ls -l
查看 passwd 文件和 temp 文件夹的权限会发现有 s 和 t 权限
$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 67K Jul 15 2021 /usr/bin/passwd
注:
ls -ld
是查看文件夹权限
那这个 s 和 t 是什么权限呢?他们是一组特殊的权限 SUID、SGID、SBIT
SUID、SGID、SBIT 权限都是为了实现特殊功能而设计的,其目的是弥补 ugo 权限无法实现的一些使用场景。
SUID
当 s 出现在文件拥有者的 x 权限上时,就被称为 SETUID BITS 或 SETUID ,其特点如下:
- SUID 权限仅对二进制可执行文件有效(对脚本无效)
- 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
- 本权限仅在执行该二进制可执行文件的过程中有效
举个例子:
我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:
$ ls -ld /etc/shadow
-rw-r----- 1 root shadow 1083 Jan 8 18:42 /etc/shadow
意思是这个文件仅有 root 可读且仅有 root 可以强制写入而已。 既然这个文件仅有 root 可以修改,那使用其他用户时是如何修改密码的呢?
再来看下这个 passwd 命令
$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 67K Jul 15 2021 /usr/bin/passwd
可以发现 passwd 有个 s,其实这就是 SUID 的功能啦!借由上述的功能说明,我们可以知道
- passwd 的拥有者是 root 这个帐号;
- 一般用户执行 passwd 的过程中,会 “暂时” 获得 root 的权限;
- /etc/shadow 就可以被一般用户所执行的 passwd 所修改。
但是如果由一般用户执行 cat 命令去读取 /etc/shadow 文件确是不行的:
$ ls -ld /etc/shadow
-rw-r----- 1 root shadow 1083 Jan 8 18:42 /etc/shadow
原因很清楚,一般用户没有读 /etc/shadow 文件的权限,同时 cat 程序也没有被设置 SUID。
所以整个流程是这样的(tester 是一般用户):
如果想让任意用户通过 cat 命令读取 /etc/shadow 文件的内容也是非常容易的,给它设置 SUID 权限就可以了:
$ sudo chmod 4755 /bin/cat
现在 cat 已经具有了 SUID 权限,试试看,是不是已经可以 cat 到 /etc/shadow 的内容了。因为这样做非常不安全,所以赶快通过下面的命令把 cat 的 SUID 权限移除掉:
$ sudo chmod 755 /bin/cat
SGID
当 s 标志出现在用户组的 x 权限时称为 SGID。SGID 的特点与 SUID 相同
以 mlocale 为例,程序的执行过程如下图所示:
SBIT
当出现 t 时表示它是 SBIT
其实 SBIT 与 SUID 和 SGID 的关系并不大。 SBIT 是 the restricted deletion flag or sticky bit 的简称。 SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:
$ ll -d /tmp
drwxrwxrwt 2 root root 4.0K Jan 15 15:06 /tmp
权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除。
设置 SUID、SGID、SBIT 权限
以数字的方式设置权限 SUID、SGID、SBIT 权限对应的数字如下:
SUID->4
SGID->2
SBIT->1
所以如果要为一个文件权限为 "-rwxr-xr-x" 的文件设置 SUID 权限,需要在原先的 755 前面加上 4,也就是 4755:
$ chmod 4755 filename
同样,可以用 2 和 1 来设置 SGID 和 SBIT 权限。设置完成后分别会用 s, s, t 代替文件权限中的 x。
其实,还可能出现 S 和 T 的情况。S 和 t 是替代 x 这个权限的,但是,如果它本身没有 x 这个权限,添加 SUID、SGID、SBIT 权限后就会显示为大写 S 或大写 T。比如我们为一个权限为 666 的文件添加 SUID、SGID、SBIT 权限:
执行 chmod 7666 nickfile,因为 666 表示 "-rw-rw-rw",均没有 x 权限,所以最后变成了 "-rwSrwSrwT"。
通过符号类型改变权限
除了使用数字来修改权限,还可以使用符号:
$ chmod u+s testfile # 为 testfile 文件加上 SUID 权限。
$ chmod g+s testdir # 为 testdir 目录加上 SGID 权限。
$ chmod o+t testdir # 为 testdir 目录加上 SBIT 权限。